/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ec.socialfun.servicios;

import com.ec.socialfun.entidades.Evento;
import com.ec.socialfun.entidades.Local;
import com.ec.socialfun.entidades.Sucursal;
import com.ec.socialfun.enumeradores.EstadoEnum;
import com.ec.socialfun.enumeradores.MostrarFotosEnum;
import com.ec.socialfun.enumeradores.ParametrosEnum;
import com.ec.socialfun.excepciones.CreaEventoException;
import com.ec.socialfun.excepciones.CrearArchivoException;
import com.ec.socialfun.excepciones.ParametroException;
import com.ec.socialfun.servicios.externos.FtpServicio;
import com.ec.socialfun.util.Consulta;
import com.ec.socialfun.util.ConsultasUtil;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.jboss.logging.Logger;

/**
 *
 * @author hp
 */
@Stateless
public class EventoFacade extends AbstractFacade<Evento> {

    private static final Logger LOG = Logger.getLogger(EventoFacade.class.getName());
    @PersistenceContext(unitName = "SocialFunPU")
    private EntityManager em;
    @EJB
    private ParametrosFacade parametroFacade;
    @EJB
    private FtpServicio ftpServicio;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public EventoFacade() {
        super(Evento.class);
    }

    public Consulta buscarEventoLocalSucursal(Consulta consulta) {

        // consulta para conteo total de datos
        StringBuilder sbContador = new StringBuilder();
        sbContador.append("SELECT COUNT(e) FROM Evento e ");

        // consulta obtencio de datos
        StringBuilder sbConsulta = new StringBuilder();
        sbConsulta.append("SELECT e FROM Evento e");

        if (!consulta.getFiltro().isEmpty()) {
            String condiciones = ConsultasUtil.armarCondiciones(consulta.getFiltro());
            sbContador.append(condiciones);
            sbConsulta.append(condiciones);
        }

        if (consulta.getColumnaOrdenar() != null && consulta.getTipoDeOrdenamiento() != null) {
            sbConsulta.append(" ORDER BY ").append(consulta.getColumnaOrdenar()).append(" ").append(consulta.getTipoDeOrdenamiento().getCodigo());
        }

        Query q = em.createQuery(sbContador.toString());
        consulta.setContador((Long) q.getSingleResult());

        q = em.createQuery(sbConsulta.toString());
        q.setFirstResult(consulta.getPrimerRegistro());
        q.setMaxResults(consulta.getTamanoPagina());
        consulta.setLista(q.getResultList());

        return consulta;
    }

    /**
     *  Recupera eventos de una sucrusal
     * @param sucursal
     * @return
     * @throws ParametroException
     */
    public List<Evento> recuperaEventosPorSucursal(Sucursal sucursal) throws ParametroException {
        Query q = em.createNamedQuery("Evento.RecuperarEventoPorSucursal");
        q.setParameter("suCodigo", sucursal.getSuCodigo());
        q.setMaxResults(Integer.parseInt(parametroFacade.recuperaPorNombre(ParametrosEnum.NUMERO_REGISTROS.getNombre()).getPaValor()));
        return q.getResultList();
    }

    /**
     * metodo que crea un nuevo evento y su respectivo fichero
     * @param evento
     * @throws CreaEventoException
     */
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void crearEvento(Evento evento) throws CreaEventoException {
        try {
            evento.setEvEstado(EstadoEnum.ACTIVO.getCodigo());
            evento.setEvFoto("pendiente");
            em.persist(evento);
            ftpServicio.crearFicheroImagenesEventoFtp(evento);

        } catch (CrearArchivoException e) {
            LOG.error("Error al crear carpeta para el evento " + e);
            throw new CreaEventoException(" Error al crear carpeta para el evento");
        } catch (Exception e) {
            LOG.error("Error al crear evento " + e);
            throw new CreaEventoException(" Error al crear el evento");

        }
    }

    /**
     *  Recupera Evento por codigo
     * @param codigo
     * @return
     */
    public Evento recuperaPorCodigo(Integer evCodigo) {
        Query q = em.createNamedQuery("Evento.findByEvCodigo");
        q.setParameter("evCodigo", evCodigo);
        return (Evento) q.getSingleResult();
    }

    /**
     *  Recuper lista de eventos
     * @return
     */
    public List<Evento> recuperaEventos() {
        Query q = em.createQuery("Evento.findAll");
        return q.getResultList();
    }

    /**
     *  Recupera los eventos de una sucursal con fecha de finalizacion menor a la fecha actual
     * @param codigoSucursal
     * @return
     */
    public List<Evento> recuperarEventosSucursal(Integer codigoSucursal) {
        Query q = em.createNamedQuery("Evento.RecuperarEventoSucursal");
        q.setParameter("suCodigo", codigoSucursal);
        q.setParameter("fecha", new Date());
        if (q.getResultList().isEmpty()) {
            return null;
        } else {
            LOG.info("Lista Eventos " + q.getResultList());
            return q.getResultList();
        }
    }

    /**
     * recupera los eventos de una sucursal dependiendo del parametro del local que indica
     *  si se recupera los eventos solo de ese dia (DIA) o todos (TOD)
     * @param sucursal
     * @param local
     * @return
     */
    public List<Evento> recuperaEventoPorSucursalYFecha(Sucursal sucursal, Local local) {
        Calendar cal = Calendar.getInstance();
        Date fechaActual = cal.getTime();
        cal.set(Calendar.HOUR_OF_DAY,23);
        cal.set(Calendar.MINUTE,59);
        cal.set(Calendar.SECOND,59);
        Date fechaDiaSiguiente = cal.getTime();
       
        StringBuilder sb = new StringBuilder();
        sb.append("SELECT e FROM Evento e WHERE e.suCodigo.suCodigo = :suCodigo AND ");
        if (local.getLoMostrarFotos().equals(MostrarFotosEnum.TODAS.getCodigo())) {
            sb.append(" e.evFechaFin >= :fechaActual");
        } else {
            sb.append(" e.evFechaFin >= :fechaActual and e.evFechaFin < :fechaDiaSiguiente  ");

        }

        Query q = em.createQuery(sb.toString());
         q.setParameter("suCodigo", sucursal.getSuCodigo());
        q.setParameter("fechaActual", fechaActual);
        if (local.getLoMostrarFotos().equals(MostrarFotosEnum.DIA.getCodigo())) {
             q.setParameter("fechaDiaSiguiente", fechaDiaSiguiente);
        }

        return q.getResultList();
    }
}
